//package com.cli.springboottemplateengine.engine.analyze;
//
//import freemarker.core.*;
//import freemarker.template.Configuration;
//import freemarker.template.Template;
//
//import java.io.StringReader;
//import java.util.LinkedHashSet;
//import java.util.Set;
//
//public class FreemarkerVariableAnalyzer implements TemplateVariableAnalyzer {
//
//    @Override
//    public Set<String> extractVariables(String templateContent) {
//        Set<String> variables = new LinkedHashSet<>();
//        try {
//            Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
//            Template template = new Template("name", new StringReader(templateContent), cfg);
//            TemplateElement root = template.getRootTreeNode();
//            visitElement(root, variables);
//        } catch (Exception e) {
//            throw new RuntimeException("Freemarker模板解析异常", e);
//        }
//        return variables;
//    }
//
//    private void visitElement(TemplateElement element, Set<String> vars) {
//        if (element == null) return;
//
//        for (int i = 0; i < element.getChildCount(); i++) {
//            visitElement(element.getChildAt(i), vars);
//        }
//
//        if (element instanceof ConditionalBlock) {
//            visitExpression(((ConditionalBlock) element).getConditionExpression(), vars);
//        } else if (element instanceof IteratorBlock) {
//            visitExpression(((IteratorBlock) element).getListExpression(), vars);
//        } else if (element instanceof Assignment) {
//            visitExpression(((Assignment) element).getExpression(), vars);
//        } else if (element instanceof Expression) {
//            visitExpression((Expression) element, vars);
//        } else if (element instanceof Interpolation) {
//            visitExpression(((Interpolation) element).getExpression(), vars);
//        } else if (element instanceof DollarVariable) {
//            visitExpression(((DollarVariable) element).getExpression(), vars);
//        }
//    }
//
//    private void visitExpression(Expression expr, Set<String> vars) {
//        if (expr == null) return;
//
//        if (expr instanceof Identifier) {
//            vars.add(expr.toString());
//        } else if (expr instanceof Dot) {
//            vars.add(buildFullPath((Dot) expr));
//        } else if (expr instanceof BuiltIn) {
//            visitExpression(((BuiltIn) expr).getTarget(), vars);
//        } else if (expr instanceof MethodCall) {
//            visitExpression(((MethodCall) expr).getTarget(), vars);
//        } else if (expr instanceof ParentheticalExpression) {
//            visitExpression(((ParentheticalExpression) expr).getExpression(), vars);
//        } else if (expr instanceof ConditionalExpression) {
//            visitExpression(((ConditionalExpression) expr).getCondition(), vars);
//            visitExpression(((ConditionalExpression) expr).getLho(), vars);
//            visitExpression(((ConditionalExpression) expr).getRho(), vars);
//        } else if (expr instanceof DynamicKeyName) {
//            visitExpression(((DynamicKeyName) expr).getLho(), vars);
//            visitExpression(((DynamicKeyName) expr).getRho(), vars);
//        } else {
//            for (int i = 0; i < expr.getChildCount(); i++) {
//                visitExpression(expr.getChildAt(i), vars);
//            }
//        }
//    }
//
//    private String buildFullPath(Dot dot) {
//        StringBuilder sb = new StringBuilder();
//        buildFullPathRecursive(dot, sb);
//        return sb.toString();
//    }
//
//    private void buildFullPathRecursive(Expression expr, StringBuilder sb) {
//        if (expr instanceof Dot) {
//            buildFullPathRecursive(((Dot) expr).getLHO(), sb);
//            sb.append(".");
//            sb.append(((Dot) expr).getRHO().toString());
//        } else if (expr instanceof Identifier) {
//            sb.append(expr.toString());
//        } else {
//            sb.append(expr.toString());
//        }
//    }
//}
//
